home *** CD-ROM | disk | FTP | other *** search
/ Gigarom 1 / Gigarom Macintosh Archives (Quantum Leap)(CDRM1080320)(1993).iso / FILES / DEV / I-Z / Xlisp_Source.cpt / macstuff14.c < prev    next >
Text File  |  1985-04-08  |  7KB  |  356 lines

  1. /* macstuff.c - macintosh interface routines for xlisp */
  2.  
  3. overlay "macstuff"
  4.  
  5. #include <qd.h>  
  6. #include <mem.h>
  7. #include <file.h>
  8. #include <font.h>
  9. #include <win.h>
  10. #include <menu.h>
  11. #include <dialog.h>
  12. #include <event.h>
  13. #include <pack.h>
  14. #include <stdio.h>
  15.  
  16. #define lastmenu 3
  17. #define applemenu 1
  18. #define filemenu 256
  19. #define controlmenu 257
  20.  
  21. extern char *s_unbound;
  22.  
  23. #include <qdvars.h>    /* quickdraw globals */
  24. menuhandle mymenus[lastmenu];
  25. rect screenrect,dragrect;
  26. eventrecord myevent;
  27. windowrecord wrecord;
  28. windowptr mywindow,whichwindow;
  29. rgnhandle updatergn;
  30. sfreply loadfile;
  31. ostype filetypes[] = { {'T','E','X','T'} };
  32. int themenu,theitem;
  33. int code,refnum;
  34. int x,y;
  35.  
  36. #define TIMEON    500
  37. #define TIMEOFF    100
  38. int cursortime,cursorstate;
  39.  
  40. #define SCRH    24
  41. #define SCRW    80
  42. char screen[SCRH*SCRW],*topline,*curline;
  43.  
  44. #define LINEMAX 200
  45. char linebuf[LINEMAX+1],*lineptr;
  46. int linepos[LINEMAX],linelen;
  47.  
  48. #define CHARMAX 100
  49. char charbuf[CHARMAX],*inptr,*outptr;
  50. int charcnt;
  51.  
  52. macinit(name)
  53.   char *name;
  54. {
  55.     initgraf(&theport);
  56.     initfonts();
  57.     initwindows();
  58.     initmenus();
  59.     teinit();
  60.     initdialogs(0L);
  61.     initcursor();
  62.  
  63.     setupmenus();
  64.  
  65.     setrect(&screenrect,5,40,505,335);
  66.     setrect(&dragrect,4,24,screenrect.a.right-4,screenrect.a.bottom-4);
  67.  
  68.     mywindow = newwindow(&wrecord,&screenrect,name,1,0,-1L,1,0L);
  69.     setport(mywindow);
  70.  
  71.     updatergn = newrgn();
  72.  
  73.     textfont(monaco); textsize(9); textmode(srccopy);
  74.  
  75.     cursorstate = -1;
  76.  
  77.     curline = screen;
  78.     for (y = 0; y < SCRH; y++)
  79.     for (x = 0; x < SCRW; x++)
  80.         *curline++ = ' ';
  81.  
  82.     topline = curline = screen;
  83.     inptr = outptr = charbuf;
  84.     linelen = charcnt = 0;
  85.     x = y = 0;
  86. }
  87.  
  88. int macgetc(fp)
  89.   FILE *fp;
  90. {
  91.     if (fp == stdin) return (linegetc());
  92.     else return (getc(fp));
  93. }
  94.  
  95. int macputc(ch,fp)
  96.   int ch; FILE *fp;
  97. {
  98.     macidle();
  99.     if (fp == stdout) return (lineputc(ch));
  100.     else return (putc(ch,fp));
  101. }
  102.  
  103. setupmenus()
  104. {
  105.     char appletitle[2];
  106.     int i;
  107.  
  108.     appletitle[0] = applesymbol; appletitle[1] = 0;
  109.     mymenus[0] = newmenu(applemenu, appletitle);
  110.     addresmenu(mymenus[0],"DRVR");
  111.     mymenus[1] = newmenu(filemenu,"File");
  112.     appendmenu(mymenus[1],"Load.../L;(-;Quit/Q");
  113.     mymenus[2] = newmenu(controlmenu,"Control");
  114.     appendmenu(mymenus[2],"Break/B");
  115.     for (i = 0; i < lastmenu; i++)
  116.     insertmenu(mymenus[i],0);
  117.     drawmenubar();
  118. }
  119.  
  120. int linegetc()
  121. {
  122.     int ch;
  123.  
  124.     if (linelen--) return (*lineptr++);
  125.     linelen = 0;
  126.     while ((ch = scrgetc()) != '\r')
  127.     switch (ch) {
  128.     case '\010':
  129.         if (linelen > 0) {
  130.         linelen--;
  131.         while (x > linepos[linelen]) {
  132.             scrputc('\010'); scrputc(' '); scrputc('\010');
  133.         }
  134.         }
  135.         break;
  136.     default:
  137.         if (linelen < LINEMAX) { linebuf[linelen] = ch; linepos[linelen] = x; linelen++; }
  138.         scrputc(ch);
  139.         break;
  140.     }
  141.     lineputc('\n');
  142.     linebuf[linelen] = '\n';
  143.     lineptr = linebuf;
  144.     return (*lineptr++);
  145. }
  146.  
  147. int lineputc(ch)
  148.   int ch;
  149. {
  150.     if (ch == '\n') scrputc('\r');
  151.     scrputc(ch);
  152.     return (1);
  153. }
  154.  
  155. int scrgetc()
  156. {
  157.     int ch;
  158.     cursorstate = cursortime = 0;
  159.     while (charcnt == 0)
  160.     macidle();
  161.     if (cursorstate == 1) { scrposition(x,y); drawchar(' '); }
  162.     cursorstate = -1;
  163.     ch = *outptr++; charcnt--;
  164.     if (outptr >= &charbuf[CHARMAX])
  165.     outptr = charbuf;
  166.     return (ch);
  167. }
  168.  
  169. macidle()
  170. {
  171.     int ch;
  172.     
  173.     systemtask();
  174.     scrcursorupdate();
  175.  
  176.     while (getnextevent(everyevent,&myevent))
  177.     switch (myevent.what) {
  178.         case mousedown:
  179.         code = findwindow(&myevent.where,&whichwindow);
  180.         switch (code) {
  181.             case inmenubar:
  182.             docommand(menuselect(&myevent.where));
  183.             break;
  184.             case insyswindow:
  185.             systemclick(&myevent,whichwindow);
  186.             break;
  187.             case indrag:
  188.             dragwindow(whichwindow,&myevent.where,&dragrect);
  189.             break;
  190.             case ingoaway:
  191.             if (trackgoaway(whichwindow,&myevent.where))
  192.                 exit();
  193.             break;
  194.             case ingrow:
  195.             case incontent:
  196.             if (whichwindow != frontwindow())
  197.                 selectwindow(whichwindow);
  198.             break;
  199.         }
  200.         break;
  201.         case keydown:
  202.         case autokey:
  203.         if (mywindow == frontwindow()) {
  204.             ch = myevent.message & 0xFF;
  205.             if (myevent.modifiers & 0x100)
  206.             switch (ch) {
  207.             case 'l':
  208.             case 'L':
  209.                 docommand(filemenu,1); continue;
  210.             case 'q':
  211.             case 'Q':
  212.                 docommand(filemenu,3); continue;
  213.             case 'b':
  214.             case 'B':
  215.                 docommand(controlmenu,1); continue;
  216.             default:
  217.                 ch &= 0x1F; break;
  218.             }
  219.             if (charcnt < CHARMAX) {
  220.                 *inptr++ = ch; charcnt++;
  221.             if (inptr >= &charbuf[CHARMAX])
  222.                 inptr = charbuf;
  223.             }
  224.         }
  225.         break;
  226.         case activateevt:
  227.         if (myevent.modifiers & 1)
  228.             ;
  229.         else
  230.             ;
  231.         break;
  232.         case updateevt:
  233.         setport(mywindow);
  234.         beginupdate(mywindow);
  235.         doupdate();
  236.         endupdate(mywindow);
  237.         break;
  238.     }
  239. }
  240.  
  241. scrcursorupdate()
  242. {
  243.     if (cursorstate != -1)
  244.     if (cursortime-- < 0) {
  245.         scrposition(x,y);
  246.         if (cursorstate) {
  247.         drawchar(' ');
  248.         cursortime = TIMEOFF;
  249.         cursorstate = 0;
  250.         }
  251.         else {
  252.         drawchar('_');
  253.         cursortime = TIMEON;
  254.         cursorstate = 1;
  255.         }
  256.     }
  257. }
  258.  
  259. scrputc(ch)
  260.   int ch;
  261. {
  262.     if (ch == '\r') x = 0;
  263.     else if (ch == '\n') { nextline(&curline); if (y < 23) y++; else scrollup(); }
  264.     else if (ch == '\t') { scrputc(' '); while (x & 7) scrputc(' '); }
  265.     else if (ch == '\010') { if (x) x--; }
  266.     else if (ch >= 0x20 && ch < 0x7F) {
  267.     scrposition(x,y);
  268.     drawchar(ch);
  269.     curline[x] = ch;
  270.     if (x < 79) x++;
  271.     else { x = 0; nextline(&curline); if (y < 23) y++; else scrollup(); }
  272.     }
  273. }
  274.  
  275. scrposition(x,y)
  276.   int x,y;
  277. {
  278.     moveto((x * 6) + 5,(y * 12) + 10);
  279. }
  280.  
  281. pascal filefilter(pblock)
  282.   paramblkptr pblock;
  283. {
  284.     char *p; int len;
  285.     p = pblock->ionameptr; len = *p++ &0xFF;
  286.     while (len--) if (*p++ == '.' && len == 3 && *p++ == 'l' && *p++ == 's' && *p == 'p') return (0);
  287.     return (0x100);
  288. }
  289.  
  290. docommand(themenu,theitem)
  291. int themenu,theitem;
  292. {
  293.     char name[256];
  294.     point p;
  295.     
  296.     hilitemenu(themenu);
  297.     switch (themenu) {
  298.     case applemenu:
  299.     getitem(mymenus[0],theitem,name);
  300.     refnum = opendeskacc(name);
  301.     break;
  302.     case filemenu:
  303.     switch (theitem) {
  304.     case 1:    /* load */
  305.         p.a.h = 100; p.a.v = 100;
  306.         sfgetfile(&p,"",filefilter,-1,filetypes,0L,&loadfile);
  307.         if (loadfile.good) {
  308.         hilitemenu(0);
  309.         setvol(0L,loadfile.vrefnum);
  310.         if (!xlload(loadfile.fname,0,0))
  311.             xlabort("load error");
  312.         }
  313.         break;
  314.     case 3:    /* quit */
  315.         exit();
  316.     }
  317.     break;
  318.     case controlmenu:
  319.     hilitemenu(0);
  320.     switch (theitem) {
  321.     case 1:    /* break */
  322.         lineptr = linebuf; linebuf[0] = '\n'; linelen = 1;
  323.         xlbreak("user break",s_unbound);
  324.         break;
  325.     }
  326.     break;
  327.     }
  328.     hilitemenu(0);
  329. }
  330.  
  331. doupdate()
  332. {
  333.     char *line; int y;
  334.     line = topline;
  335.     for (y = 0; y < SCRH; y++) {
  336.     scrposition(0,y);
  337.     drawtext(line,0,SCRW);
  338.     nextline(&line);
  339.     }
  340. }
  341.  
  342. nextline(pline)
  343.   char **pline;
  344. {
  345.     if ((*pline += SCRW) >= &screen[SCRH*SCRW]) *pline = screen;
  346. }
  347.  
  348. scrollup()
  349. {
  350.     rect rect; int x;
  351.     setrect(&rect,0,0,500,295);
  352.     scrollrect(&rect,0,-12,updatergn);
  353.     for (x = 0; x < SCRW; x++) topline[x] = ' ';
  354.     nextline(&topline);
  355. }
  356.